home *** CD-ROM | disk | FTP | other *** search
- *------------------------------------------------------------------------*
- * MM *
- * ( pour My Memory ) *
- * V 1.2 *
- *------------------------------------------------------------------------*
- * Par AmiPhil *
- * *
- * Commencé le : 22.02.89 *
- * Achevé le : 23.02.89 *
- * Révisé le : 06.01.90 utilisation de RawDoFmt *
- * pour le formatage *
- *------------------------------------------------------------------------*
- * Programme qui affiche en permanence la memoire disponible dans une *
- * petite fenetre que l'on peut déplacer à volonté et fermer lorsque *
- * on a plus besoin. *
- * Ameliorations *
- * Il est aussi possible de connaitre la position la plus basse atteinte *
- * par la memoire disponible en appuyant sur le gadget de fermeture de la *
- * fenetre sans relacher le bouton sur celui-ci (ce qui aurait pour *
- * conséquence la fermeture de la fenetre et la fin du programme). *
- * Vous avez alors 2 secondes pour lire le minimum atteint par la memoire *
- * depuis la dernière lecture du minimum, car le mini est reinitialisé *
- * aussitot apres. *
- * Puis encore 2 secondes pour lire la difference MemActuelle-MemMINI *
- * *
- * Le type de memoire, peut etre selectionné au clavier touches : *
- * T(otal) ,F(ast) ou C(hip) apres avoir activé la fenetre *
- * toutes les valeurs afichées concernent Uniquement le mode affiché: *
- * soit T , F ou C, aussi bien pour les minis que pour les differences *
- * entre le mini et la mem courante *
- * *
- * Cela vous permettra de savoir si vous n'avez pas, par exemple frisé la *
- * catastrophe lors d'une compilation avec peu de memoire ou bien savoir *
- * Quelle quantité de memoire utilise tel ou tel programme *
- * Les valeurs sont remises à jour tous les 20 ticks (NORMDEL) *
- * *
- * La fonction utilisée pour convertir le Long retourné par AvailMem() *
- * en une chaine ASCII est maintenant RawDoFmt, j'ai enfin pigé comment *
- * marche ce truc-la. C'est une fonction que j'ai rarement vue utilisée *
- * et qui permet le formatage de donnes, comme le printf du C a partir de *
- * l'assembleur, donc assez interessante. *
- * *
- * et vivement que j'ai 2 Mégas, *
- *------------------------------------------------------------------------*
-
-
-
-
- INCLUDE "INCLUDE:INTUITION/INTUITION.I"
- INCLUDE "INCLUDE:GRAPHICS/RASTPORT.I"
- INCLUDE "INCLUDE:EXEC/MEMORY.I"
-
-
- XTRN MACRO
- XREF _LVO\1
- ENDM
-
- CALL MACRO
- jsr _LVO\1(a6)
- ENDM
-
-
- XTRN OpenLibrary
- XTRN GetMsg
- XTRN ReplyMsg
- XTRN AvailMem
-
- XTRN Delay
-
- XTRN OpenWindow
- XTRN CloseWindow
- XTRN CloseLibrary
- XTRN PrintIText
- XTRN RawDoFmt
-
- XREF _AbsExecBase
-
- NULL EQU 0
- WIDTH EQU 104
- MAXIMUM EQU $FFFFFFF
- MINIDEL EQU 100
- NORMDEL EQU 20
-
-
-
- main:
- move.l _AbsExecBase,a6 ;ouvrir le dos
- clr.l d0 ;pour utiliser Delay()
- lea DosName(pc),a1
- CALL OpenLibrary
- move.l d0,DosBase
-
- clr.l d0 ;ouvrir intuition
- lea IntuiName(pc),a1 ;pour gestion fenetre
- CALL OpenLibrary ;texte et messages
- move.l d0,IntuitionBase
-
- move.l d0,a6 ;ouvrir une fenetre
- lea MyNewWindow(pc),a0 ;definie + bas
- CALL OpenWindow
- move.l d0,MyWindow
- move.l #MAXIMUM,d4 ;mise au maximum du minimum :-)
- move.l #MEMF_PUBLIC,d6
-
- loop: ;boucle principale
- move.l #NORMDEL,d5 ;1/2 seconde pour le Delay()
- move.l _AbsExecBase,a6 ;appel de la fonction avail
- move.l d6,d1
- CALL AvailMem ;qui retourne la taille memoire dans d0
- move.l d0,Current
- cmp.l d0,d4 ;comparer avec le minimum atteint jusqu'à présent
- blt.s go ;
- move.l d0,d4 ;si inférieur réactualiser le mini (d4)
-
- go:
- cmp.l #MAXIMUM,d0
- beq loop
- bsr convert ;Convertir d0 en une string ASCII
- ; et affichage
-
- test:
- move.l _AbsExecBase,a6 ;ExecBase dans a6
- move.l MyWindow(pc),a0
- move.l wd_UserPort(a0),a0 ;UserPort de la window dans a0
- CALL GetMsg ;appel GetMsg
- tst.l d0 ;Y a t'il un message ?
- beq loop ;non ! alors on continue
-
- move.l d0,d3 ;oui ! alors sauvons le message dans d3
- move.l d0,a1 ;et
- CALL ReplyMsg ;renvoyons l'accusé réception
- move.l d3,a0 ;puis verifions si
- move.l im_Class(a0),d0 ;c'est
-
- cmp.l #CLOSEWINDOW,d0 ;CLOSEWINDOW
- beq closeall ;et fermons tout
- cmp.l #VANILLAKEY,d0 ;est-ce une touche clavier ?
- bne DispMini
- move.w im_Code(a0),d0
- and.b #$df,d0 ;To UpperCase
- TestC: cmp.b #'C',d0
- bne TestF
- move.l #MEMF_CHIP,d6
- bra TEnd
- TestF: cmp.b #'F',d0
- bne TestT
- move.l #MEMF_FAST,d6
- bra TEnd
- TestT: cmp.b #'T',d0
- bne loop
- move.l #MEMF_PUBLIC,d6
- TEnd: move.b d0,StringText
- move.l #MAXIMUM,d4
- bra loop
-
- DispMini:
- move.l d4,d0
- move.l #MINIDEL,d5 ;delay d'affichage 2 secondes
- bsr convert
- move.l Current(pc),d0
- sub.l d4,d0
- move.l #MAXIMUM,d4 ;reinitialisation du mini
- bra go ;et on boucle
-
-
- *==================================================================
-
- closeall:
-
- move.l IntuitionBase(pc),a6 ;fermer fenetre
- move.l MyWindow(pc),a0
- CALL CloseWindow
-
- move.l _AbsExecBase,a6
-
- move.l IntuitionBase(pc),a1 ;fermer intuition
- CALL CloseLibrary
-
- move.l DosBase(pc),a1 ;fermer dos
- CALL CloseLibrary
-
- rts
-
- CNOP 0,4
- *==================================================================
- convert: ;le nombre a afficher est dans d0
-
- move.l d0,ToDisplay
-
- move.l _AbsExecBase,a6
- lea OutStr(pc),a0 ;ptr sur chaine de formatage
- lea ToDisplay(pc),a1 ;ptr sur valeur à formater
- lea PutChar(pc),a2 ;ptr sur fonction de transfert datas
- lea MemBuffer(pc),a3 ;ptr sur buffer pour la chaine ASCII
-
- CALL RawDoFmt ;Ah enfin j'ai reussi a faire marcher
- * ;ca !!
-
- move.l IntuitionBase(pc),a6 ;IntuitionBase ->a6
- move.l MyWindow(pc),a0
- move.l wd_RPort(a0),a0 ;RastPort de la window dans a0
- lea MemText(pc),a1 ;structure IntuiText dans a1
- move.l #30,d0 ;décalage horizontal dans d0
- move.l #1,d1 ;décalage vertical dans d1
- CALL PrintIText ;appel de PrintItext
-
- move.l DosBase(pc),a6 ;Dosbase dans a6
- move.l d5,d1 ;d5 = 20 (normal)ou 100(affichage du mini)
- CALL Delay ;on temporise avec delay
-
- rts
- *-----------------------------------------------------------------
- PutChar: ;fonction definie par l'utilisateur
- ;pour utiliser RawDoFmt. vu ca simplicité
- move.b d0,(a3)+ ;je ne vois pas pourquoi elle n'a pas été
- rts ;incluse dans la fonction, sutout que j'ai
- * ;tatonné un peu avant de trouver ca qui et
- * ;si simple......
-
- *-----------------------------------------------------------------
-
- MyWindow: dc.l 0 ;Handle de la window
- IntuitionBase: dc.l 0 ;place pour
- DosBase: dc.l 0 ;les librairies
-
- Current: dc.l 0 ;mem courrante
- ToDisplay: dc.l 0 ;chiffre à afficher
-
- IntuiName: dc.b 'intuition.library',0
- DosName: dc.b 'dos.library',0
- WindowTitle: dc.b 'AmiPhil90',0
- StringText dc.b 'T:' ;Buffer ASCII pour le Type of Mem
- MemBuffer: dc.b ' ',0 ;buffer ASCII pour MemText
- OutStr: dc.b '%7ld',0 ;chaine de formatage pour RawDoFmt
-
- CNOP 0,2
- *=================================================================
- MyNewWindow: ;definition fenetre
- dc.w (587-WIDTH),0
- dc.w WIDTH,10
- dc.b 0,3
- dc.l CLOSEWINDOW+MOUSEBUTTONS+VANILLAKEY
- dc.l WINDOWCLOSE+WINDOWDRAG+SMART_REFRESH+NOCAREREFRESH
- dc.l NULL
- dc.l NULL
- dc.l WindowTitle
- dc.l NULL
- dc.l NULL
- dc.w 0,0
- dc.w 0,0
- dc.w WBENCHSCREEN
-
- CNOP 0,2
-
- MemText: ;structure IntuiText
- dc.b 1,0,RP_JAM2,0 ;pour PrintItext
- dc.w 0,0
- dc.l NULL
- dc.l StringText
- dc.l NULL
-
- END
-